package com.ingenio.siot.adapter;

import java.io.IOException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Altura;
import com.ingenio.siot.entity.Linea;
import com.ingenio.siot.entity.TipoCalle;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class LineaAdapter extends Adapter{
	
	public List<Linea> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<Linea> lineas = new ArrayList<Linea>();
    	PreparedStatement stmt = null;
    	AlturaAdapter aa = new AlturaAdapter();
    	List<Altura> alturas = new ArrayList<Altura>();
    	List<Altura> alturasDibujo = new ArrayList<Altura>();
    	TipoCalleAdapter tca = new TipoCalleAdapter();
    	TipoCalle tc = null;
		try {
			conn = (Connection) abrirConexion();
    		Linea l = null;
    		String sel ="SELECT * from lineas";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery(sel);
    		while(result.next()){
    			Integer idLinea = result.getInt("IdLinea");
    			Integer idTipoCalle = result.getInt("IdTipoCalle");
    			tc = tca.devolverTipoCalle(idTipoCalle);
    			Integer idInicio = result.getInt("IdAlturaInicio");
    			Integer idFin = result.getInt("IdAlturaFin");
    			alturas = aa.devolverAlturaInicioFin(idInicio, idFin);
    			Integer idInicioDib = result.getInt("IdAltDibujoInicio");
    			Integer idFinDib = result.getInt("IdAltDibujoFin");
    			alturasDibujo = aa.devolverAlturaInicioFinDibujo(idInicioDib, idFinDib);
    			if (alturas.size() != 2 || alturasDibujo.size() != 2){
    				throw new Exception("Error: no se puedo recuperar alturas con id: "+idInicio+" , "+idFin);
    			} else {
    				l = new Linea(idLinea, alturas.get(0), alturas.get(1), alturasDibujo.get(0), alturasDibujo.get(1), tc);
        			lineas.add(l);
    			}
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return lineas;
    }
	
	public JSONObject devolverLineasJSON() throws Exception{
		
		JSONObject jlineas = new JSONObject();
		JSONArray jLineasArray = new JSONArray();
		//JSONArray jPtosArray = new JSONArray();
		JSONObject jLinea = new JSONObject();
		JSONObject jPtoIni = new JSONObject();
		JSONObject jPtoFin = new JSONObject();
		
		LineaAdapter la = new LineaAdapter();
		List<Linea> lineas = la.devolverTodos();
		
		Linea l = null;
//		Punto p = null;
		Altura a = null;
		
		for (int i = 0; i < lineas.size(); i++) {
			
			l = lineas.get(i);
			//Punto Inicio
//			p = l.getPtoInicio();
//			jPtoIni.put("lat", p.getLatitud());
//			jPtoIni.put("lng", p.getLongitud());
			
			
			a = l.getAlturaInicioDibujo();
			jPtoIni.put("lat", a.getLatitud());
			jPtoIni.put("lng", a.getLongitud());
			
			
			jLinea.put("id", a.getIdAltura());
			jLinea.put("ptoIni", jPtoIni);
			
			//Punto FIn
//			p = l.getPtoFin();
			a = l.getAlturaFinDibujo();
			jPtoFin.put("lat", a.getLatitud());
			jPtoFin.put("lng", a.getLongitud());
			
			jLinea.put("ptoFin", jPtoFin);
			
			jLineasArray.put(jLinea);
			jLinea = new JSONObject();
			jPtoIni = new JSONObject();
			jPtoFin = new JSONObject();
		}
		
		jlineas.put("lineas", jLineasArray);
		return jlineas; 
	}
	
	
	public Linea devolverLinea(Integer idLinea) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		Linea l = null;
		AlturaAdapter aa = new AlturaAdapter();
    	List<Altura> alturas = new ArrayList<Altura>();
    	List<Altura> alturasDibujo = new ArrayList<Altura>();
    	TipoCalleAdapter tca = new TipoCalleAdapter();
    	TipoCalle tc = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String query ="SELECT * FROM lineas WHERE IdLinea = ?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setInt(1, idLinea);
    		ResultSet result = stmt.executeQuery();
    		if(result.next()){
    			Integer idTipoCalle = result.getInt("IdTipoCalle");
    			tc = tca.devolverTipoCalle(idTipoCalle);
    			Integer idInicio = result.getInt("IdAlturaInicio");
    			Integer idFin = result.getInt("IdAlturaFin");
    			alturas = aa.devolverAlturaInicioFin(idInicio, idFin);
    			Integer idInicioDib = result.getInt("IdAltDibujoInicio");
    			Integer idFinDib = result.getInt("IdAltDibujoFin");
    			alturasDibujo = aa.devolverAlturaInicioFinDibujo(idInicioDib, idFinDib);
    			if (alturas.size() != 2 || alturasDibujo.size() != 2){
    				throw new Exception("Error: no se puedo recuperar alturas con id: "+idInicio+" , "+idFin);
    			} else {
    				l = new Linea(idLinea, alturas.get(0), alturas.get(1), alturasDibujo.get(0), alturasDibujo.get(1), tc);
    			}
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return l;
	}
	
	public static void main(String[] args) throws IOException, JSONException {
//		LineaAdapter la = new LineaAdapter();
//		try {
//			JSONObject jo = la.devolverLineasJSON();
//			System.out.println(jo.toString());
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
	}
}
